home *** CD-ROM | disk | FTP | other *** search
- /*
- * %W% %E%
- *
- * Copyright (c) 1995, 1996 Sun Microsystems, Inc. All Rights Reserved.
- *
- * Permission to use, copy, modify, and distribute this software
- * and its documentation for NON-COMMERCIAL purposes and without
- * fee is hereby granted provided that this copyright notice
- * appears in all copies. Please refer to the file "copyright.html"
- * for further important copyright and licensing information.
- *
- * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
- * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
- * TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
- * PARTICULAR PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR
- * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
- * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
- *
- * CopyrightVersion 1.1_pre-beta
- */
- package examples.stock;
-
- import java.applet.Applet;
- import java.awt.*;
- import java.net.URL;
- import java.rmi.*;
- import java.rmi.server.*;
- import java.util.*;
-
- /**
- * The StockApplet exports a remote object, and contacts the StockWatch
- * server to register interest in receiving stock updates. The applet
- * displays the updates in a graph format.
- */
- public class StockApplet extends Applet
- implements StockNotify, java.io.Serializable
- {
- /** maximum number of updates displayed */
- static final int MAX_UPDATES = 34;
- /** maximum width of panel */
- private static final int width = 500;
- /** maximum height of panel */
- private static final int height = 350;
-
- /** vector containing time of each update */
- private Vector time = new Vector(MAX_UPDATES);
- /** table mapping stock names to stock data */
- private Hashtable stockTable = new Hashtable();
- /** reference to StockWatch server */
- private StockWatch stockWatch = null;
-
- private String name[] = { "Sun", "HP", "Microsoft", "DEC","Novell",
- "IBM","Apple","Netscape","Borland","SGI"};
- private Color color[]= { new Color(205,92,92),
- Color.orange,
- new Color(220,220,90),
- new Color(85, 107, 47),
- Color.blue,
- new Color(160,32,240),
- new Color(238, 130, 238),
- Color.black,
- new Color(205,120,92),
- new Color(0,100,0) };
-
- /**
- * Notification of stock updates for a particular time.
- * @param date the time of the stock update
- * @param stocks an array containing the stocks for which the
- * object has registered interest.
- */
- public void update (Date date, Stock[] stock)
- {
- System.out.println("StockApplet.update: " + date);
- // record date
- if (time.size() == MAX_UPDATES) {
- time.removeElementAt(0);
- }
- time.addElement(date);
-
- // record individual stock updates
- int numUpdates = time.size();
- for (int i=0; i<stock.length; i++) {
- StockData data = (StockData)stockTable.get(stock[i].symbol);
- if (data != null) {
- data.update(stock[i], numUpdates);
- }
- }
- repaint();
- }
-
- /**
- * Initialize applet: export the applet as remote object that gets
- * notified of stock updates.
- */
- public void init()
- {
- try {
- // export the applet as a remote object
- System.out.println("StockApplet.init: exporting remote object");
- UnicastRemoteObject.exportObject(this);
-
- // lookup StockWatch server
- URL base = getDocumentBase();
- String serverName = "//" + base.getHost() + ":" +
- getParameter("registryPort") + "/example.stock.StockServer";
-
- System.out.println("StockApplet.init: looking up server");
- stockWatch = (StockWatch)Naming.lookup(serverName);
-
- // register interest in receiving stock updates
- for (int i=0; i<name.length; i++) {
- System.out.println("StockApplet.init: watch stock " + name[i]);
- stockWatch.watch(name[i], this);
- stockTable.put(name[i], new StockData(name[i], color[i]));
- }
- System.out.println("StockApplet.init: done registering stocks");
-
- } catch (Exception e) {
- // fatal error
- System.out.println("got exception: " + e.getMessage());
- e.printStackTrace();
- return;
- }
-
- setLayout(null);
-
- // draw checkboxes
- Enumeration enum = stockTable.elements();
- int i=0;
- while (enum.hasMoreElements()) {
- StockData data = (StockData)enum.nextElement();
- SensitiveCheckbox cb = new SensitiveCheckbox (data, this);
- data.cb = cb;
- add(cb);
- cb.setState(data.displayed);
- cb.reshape(10,i++*25+35,110,18);
- }
- }
-
- /**
- * Called when applet is destroyed; the applet cancels all
- * requests for stock updates.
- */
- public void destroy()
- {
- // cancel request for stock updates
- if (stockWatch != null) {
- try {
- stockWatch.cancelAll(this);
- } catch (Exception e) {
- // eat exception
- }
- }
- }
-
- /**
- * Called to repaint the panel.
- */
- public void paint(Graphics g) {
-
- // draw black boarder
- g.setColor(Color.black);
- g.drawRect(0,0,width-1,height-1);
-
- float miny = 0.0f;
- float maxy = 75.0f;
-
- // draw all stock data
- Enumeration enum = stockTable.elements();
- while (enum.hasMoreElements()) {
- StockData data = (StockData)enum.nextElement();
-
- int size;
- Stock[] updates;
- synchronized (data.updates) {
- size = data.updates.size();
- updates = new Stock[size];
- data.updates.copyInto(updates);
- }
-
- g.setColor(data.color);
-
- if (data.displayed) {
- // draw box around checkbox if mouse is over it
- if (data.cb != null && data.cb.haveMouse()) {
- Point p = data.cb.location();
- Dimension d = data.cb.size();
-
- g.drawRect(p.x-1, p.y-1, d.width+4, d.height+4);
- g.drawRect(p.x-2, p.y-2, d.width+4, d.height+4);
- // point to graph for stock
- if (size > 0)
- g.drawLine(p.x+d.width+2,p.y+10,150,
- scale(updates[0].current));
- }
- // draw graph of updates for this stock
- int x = 150, inc = 10;
- for (int i = 0; i < size; i++) {
- if (updates[i] != null) {
- g.drawRect(x-1,scale(updates[i].current)-1,3,3);
- if ((i < size - 1) && updates[i + 1] != null) {
- int x2 = x + inc;
- g.drawLine(x, scale(updates[i].current), x2,
- scale(updates[i + 1].current));
- }
- }
- x += inc;
- }
- }
- }
- }
-
- /**
- * Used to scale y-values.
- */
- int scale(float y) {
- return height - (int) (y*5+.5);
- }
-
- /**
- * Make sure that mouseHere is set properly (fix for windows
- * display problems).
- */
- void setMouseHere(boolean display)
- {
- Enumeration enum = stockTable.elements();
- while (enum.hasMoreElements()) {
- StockData data = (StockData)enum.nextElement();
- data.cb.mouseHere = display;
- }
- }
- }
-
- /**
- * StockData contains stock updates and display information.
- */
- class StockData {
- public String name;
- public Vector updates;
- public Color color;
- public boolean displayed;
- public SensitiveCheckbox cb;
-
- public StockData(String name, Color cl) {
- this.name = name;
- this.color = cl;
- this.updates = new Vector(StockApplet.MAX_UPDATES);
- displayed = true;
- }
-
- /**
- * Update stock.
- */
- void update(Stock stock, int numUpdates)
- {
- synchronized (updates) {
- if (updates.size() == StockApplet.MAX_UPDATES) {
- updates.removeElementAt(0);
- }
- // If this stock has not received updates for previous timeslices,
- // fill them in with the current update value as well.
- if (updates.size() < numUpdates) {
- for (int i=updates.size(); i<numUpdates-1; i++) {
- updates.addElement(stock);
- }
- }
- updates.addElement(stock);
- }
- }
- }
-
- /**
- * A mouse-sensitive checkbox that records whether the mouse is over
- * the checkbox.
- */
- class SensitiveCheckbox extends Canvas {
- StockData data;
- boolean state = true;
- StockApplet panel;
- boolean mouseHere = false;
-
- public boolean haveMouse() {
- return mouseHere;
- }
-
- public SensitiveCheckbox(StockData data, StockApplet p) {
- this.data = data;
- panel = p;
- }
-
- public boolean mouseEnter(Event evt, int x, int y) {
- if (state) {
- panel.setMouseHere(false); // for windows
- mouseHere = true;
- panel.repaint();
- }
- return false;
- }
- public boolean mouseExit(Event evt, int x, int y) {
- if (state) {
- mouseHere = false;
- panel.repaint();
- }
- return false;
- }
-
- public boolean mouseDown(Event evt, int x, int y) {
- if (state)
- state = false;
- else
- state = true;
- mouseHere=state;
- data.displayed = state;
- repaint();
- panel.repaint();
- return true;
- }
-
- public void paint(Graphics g) {
- g.setColor(Color.black);
- g.drawLine(4,4,14,4);
- g.drawLine(4,4,4,14);
- g.setColor(Color.gray);
- g.drawLine(5,14,14,14);
- g.drawLine(14,5,14,14);
- g.setColor(data.color);
- g.fillRect(5,5,8,8);
- g.setColor(data.color);
- g.drawString(data.name, 17,15);
- g.setColor(Color.black);
- if (state) {
- if (data.color == Color.black)
- g.setColor(Color.gray);
- if (data.color == Color.blue)
- g.setColor(Color.gray);
- g.drawLine(5,5,13,13);
- g.drawLine(5,6,12,13);
- g.drawLine(13,5,5,13);
- g.drawLine(13,6,6,13);
- }
- }
-
- public void setState(boolean s) {
- state = s;
- repaint();
- }
- }
-